package lvq;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.Collections;
import java.util.LinkedList;
import java.util.StringTokenizer;

public class Dados {

	private File arquivo;
	private FileReader leitor;
	private BufferedReader buffer;

	private LinkedList<LinkedList<Double>> dados;

	private LinkedList<String> linhas;

	public Dados(String caminho) throws Exception {

		inicializaVariaveis();
		carregaArquivo(caminho);
		carregaLinhas();
		converteDados();

		Collections.shuffle(dados);
	}

	private void inicializaVariaveis() {

		dados = new LinkedList<LinkedList<Double>>();
		linhas = new LinkedList<String>();
		
	}

	private void carregaArquivo(String caminho) throws Exception {

		arquivo = new File(caminho);
		leitor = new FileReader(arquivo);
		buffer = new BufferedReader(leitor);
	}

	private void carregaLinhas() throws Exception {

		String linha = buffer.readLine();

		while (haLinhas(linha)) {

			linhas.add(linha);
			linha = buffer.readLine();
		}
	}

	private boolean haLinhas(String linha) {

		return linha != null;
	}

	private void converteDados() {

		for (String linha : linhas) {

			LinkedList<Double> valoresLinha = converteLinha(linha);
			dados.add(valoresLinha);
		}
	}

	private LinkedList<Double> converteLinha(String linha) {

		LinkedList<Double> valoresLinha = new LinkedList<Double>();

		StringTokenizer tokens = new StringTokenizer(linha, ";");

		while (tokens.hasMoreTokens()) {

			String valorString = tokens.nextToken();
			double valor = Double.parseDouble(valorString);
			valoresLinha.add(valor);
		}

		return valoresLinha;
	}

	public double[] obtemCoordenadas(int i) {

		LinkedList<Double> listaDados = dados.get(i);
		Double[] coordenadas = listaDados.toArray(new Double[listaDados.size()]);
		return converteDados(coordenadas);
	}

	public int quantidadeDados() {

		return dados.size();
	}

	public double[] converteDados(Double[] coordenadas) {

		double[] dadosConvertidos = new double[coordenadas.length];

		for (int i = 0; i < dadosConvertidos.length; i++) {

			dadosConvertidos[i] = coordenadas[i];
		}

		return dadosConvertidos;
	}
}
